v TThread nelze pristupovat na Excel pres OLEObject

Otázka od: Slavek

9. 9. 2004 9:57

zdravim vsechny, prosim o radu

potrebuji exportovat velke mnostvi dat do excelu a spustim ho takhle:
var
   MSExcel:Variant;
begin
   MSExcel := CreateOleObject('Excel.Application');
   MSEXCEL.Range['A1:K64'].Select;
....
end;

vse bezi vpohode, ale kdyz ten stejny kod dam do TMyThread.Execute, vyvola
to vyjimku pri prvnim pristupu k MSEXCEL po CreateOleObject:
EOleSysError "Nebyla volana procedura CoInitialize"

pokusil jsem se CoInitialize tedy zavolat ale potom zase vyjimka:
EOleSysError
"Aplikace zavolala rozhrani, ktere bylo zarazeno do jineho
podprocesu."

dik za kazdou pomoc
Slavek Hemala


Odpovedá: Petr Fejfar

9. 9. 2004 10:37

Slavek wrote:

> pokusil jsem se CoInitialize tedy zavolat ale potom zase vyjimka:
> EOleSysError
"Aplikace zavolala rozhrani, ktere bylo zarazeno do
> jineho podprocesu."

Jestli to neni tim, ze ho volas v konstruktor threadu, ktery bezi v kontextu
hlavniho threadu. Mel bys ho dat do metody Execute.

HTH, pf


Odpovedá: Ondrej Kelle

9. 9. 2004 10:56

> zdravim vsechny, prosim o radu
>
> potrebuji exportovat velke mnostvi dat do excelu a
> spustim ho takhle:
> var
> MSExcel:Variant;
> begin
> MSExcel := CreateOleObject('Excel.Application');
> MSEXCEL.Range['A1:K64'].Select;
> ....
> end;
>
> vse bezi vpohode, ale kdyz ten stejny kod dam do
> TMyThread.Execute, vyvola to vyjimku pri prvnim pristupu
> k MSEXCEL po CreateOleObject:
> EOleSysError "Nebyla volana procedura CoInitialize"
>
> pokusil jsem se CoInitialize tedy zavolat ale potom zase vyjimka:
> EOleSysError
"Aplikace zavolala rozhrani, ktere bylo zarazeno
> do jineho podprocesu."

CoInitialize/CoUninitialize musis volat pre kazdy thread, v ktorom chces
pouzivat COM, zvlast. To znamena v tele metody Execute:

procedure TMyThread.Execute;
begin
  CoInitializeEx(nil, CoInitFlags);
  try
    ...
  finally
    CoUninitialize;
  end;
end;

HTH
TOndrej

Odpovedá: Ondrej Kelle

9. 9. 2004 10:37

> CoInitializeEx(nil, CoInitFlags);

Este ma napadlo, ze CoInitializeEx moze byt nil na Win95 a WinNT 3.51, kde
tato funkcia neexistuje, takze lepsie by to mozno bolo takto:

procedure TMyThread.Execute;
begin
  if Assigned(CoInitializeEx) then
    CoInitializeEx(nil, CoInitFlags)
  else
    CoInitialize(nil);
  try
    ...
  finally
    CoUnitialize;
  end;
end;

HTH
TOndrej


Odpovedá: Slavek

9. 9. 2004 12:59

uz mi to jede,
prvne se musi volat CoInitialize(nil) a pak az CreateOLEObject uvnitr
vlakna,
CreateOLEObject jsem pred tim volal mimo vlakno

TMyTThread.Execute;
var
  MSExcel:Variant;
begin
   CoInitialize(nil);

   try
       MSExcel := CreateOleObject('Excel.Application');
.....
    finally
     CoUninitialize;
   end;
 end;






----- Original Message -----
From: "Ondrej Kelle" <o.kelle@digitalpublishing.de>
To: <delphi-l@clexpert.cz>
Sent: Thursday, September 09, 2004 11:31 AM
Subject: Re: v TThread nelze pristupovat na Excel pres OLEObject


> > zdravim vsechny, prosim o radu
> >
> > potrebuji exportovat velke mnostvi dat do excelu a
> > spustim ho takhle:
> > var
> > MSExcel:Variant;
> > begin
> > MSExcel := CreateOleObject('Excel.Application');
> > MSEXCEL.Range['A1:K64'].Select;
> > ....
> > end;
> >
> > vse bezi vpohode, ale kdyz ten stejny kod dam do
> > TMyThread.Execute, vyvola to vyjimku pri prvnim pristupu
> > k MSEXCEL po CreateOleObject:
> > EOleSysError "Nebyla volana procedura CoInitialize"
> >
> > pokusil jsem se CoInitialize tedy zavolat ale potom zase vyjimka:
> > EOleSysError
"Aplikace zavolala rozhrani, ktere bylo zarazeno
> > do jineho podprocesu."
>
> CoInitialize/CoUninitialize musis volat pre kazdy thread, v ktorom chces
> pouzivat COM, zvlast. To znamena v tele metody Execute:
>
> procedure TMyThread.Execute;
> begin
> CoInitializeEx(nil, CoInitFlags);
> try
> ...
> finally
> CoUninitialize;
> end;
> end;
>
> HTH
> TOndrej
>
>
>
>
>